package main

import (
	"fmt"
	"sync"
	"time"
)

// 创建锁
var mutex sync.Mutex
var wg2 sync.WaitGroup
var ticket = 10

func main() {
	wg2.Add(4)
	//当多个协程抢夺一个资源
	go saleTickets("收票口1")
	go saleTickets("收票口2")
	go saleTickets("收票口3")
	go saleTickets("收票口4")
	wg2.Wait()
	//让住程序多睡一会 ，要不然会出现 资源还没分配完  程序就结束的问题
	//time.Sleep(time.Second * 10)

}

// 售票函数
func saleTickets(name string) {
	defer wg2.Done()
	for {
		//打开锁 每个程序调用是会看一看 有没有人正在用这个资源  必须在for循环执行之后加锁
		mutex.Lock()
		if ticket > 0 {
			time.Sleep(time.Millisecond * 200)
			fmt.Println(name, "剩余票数：", ticket)
			ticket--
		} else {
			//操作完毕解锁
			mutex.Unlock()
			fmt.Println("票卖光了")
			break //跳出循环
		}
		//操作完毕解锁   必须在for循环结束之前解锁
		mutex.Unlock()
	}
}
